'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 ____                 ____ _
/ ___| _   _ _ __    / ___| |__   ___ _ __   __ _
\___ \| | | | '_ \  | |   | '_ \ / _ \ '_ \ / _` |
 ___) | |_| | | | | | |___| | | |  __/ | | | (_| |
|____/ \__,_|_| |_|  \____|_| |_|\___|_| |_|\__, |
											|___/
  CSV待处理.py
  Created by 灿烂 on 2021/8/20
  STATE KEY LABORATORY OF MARINE RESOURCES UTILIZATION IN SOUTH CHINA SEA ，Hainan University
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
# -*-coding:utf-8 -*-
# 第一次处理
import numpy as np
import pandas as pd
import csv, os
from pandas import read_csv
import matplotlib.pyplot as plt
# csv文件初始保存地址
read_path_1 = '文本素材/初始文件'
# csv文件删除废行后保存地址
save_path_1 = '文本素材/删除废行后的文件'
# 先创建一个空的文本
f = open("test_name_1.txt", 'w')
# 采用listdir来读取所有文件
files = os.listdir(read_path_1)
# 排序
files.sort()
# 创建一个空列表
csv_name_list_1  = []
# 循环读取每个文件名
for file_ in files:
	#print(read_path_1 +file_)
	if not os.path.isdir(read_path_1 + file_):  # 判断该文件是否是一个文件夹
		f_name = str(file_)
		# 删除.DS_Store文件
		if f_name=='.DS_Store':
			continue
		# print(f_name)
		# 把当前文件名返加到列表里
		csv_name_list_1.append(f_name)
		# 写入之前的文本中
		f.write(f_name + '\n')
# 看一下列表里的内容
# print(csv_name_list_1)

# 遍历初始文件夹中每个文件
for csvFilename in csv_name_list_1:
	line_list = list(range(0, 34))
	# 删除操作
	try:
		# 读取CSV文件
		df = read_csv(read_path_1 + '/' + csvFilename, engine='c', dialect='excel', skiprows=line_list)
		# print(df)测试用
		new_file_name = 'new' + csvFilename
		# 保存CSV文件
		df.to_csv(save_path_1 + '/' + new_file_name, index=False)
		# print(df)测试用
	except:
		pass



# 第二次处理
# 待读取批量csv的文件夹
read_path_2 = '文本素材/删除废行后的文件'
# 待保存的合并后的csv的文件夹
save_path_2 = '文本素材/待合并文件'
# 读取第一列作为合并后表格的第一列
df = read_csv(read_path_2 + '/' + 'newW0000.CSV', header=None)
# 读取第一列
sample_name = df[0]
# 将第一列保存为CSV文件
sample_name.to_csv(save_path_2 + '/'+ 'firstline.CSV', index=False)
# 读取第一列，并删除第一行索引
yoink= read_csv(save_path_2 + '/' + 'firstline.CSV', engine='c', dialect='excel', skiprows=[0])
# print(yoink)#测试用
# 保存处理好的第一列
yoink.to_csv(save_path_2 + '/'+ 'firstline.CSV', index=False)

# 先创建一个空的文本
f = open("test_name_2.txt", 'w')
# 采用listdir来读取所有文件
files = os.listdir(read_path_2)
# 排序
files.sort()
# 创建一个空列表
csv_name_list_2  = []
# 循环读取每个文件名
for file_ in files:
	# print(read_path_2 +file_)#测试用
	# 判断该文件是否是一个文件夹
	if not os.path.isdir(read_path_2 + file_):
		f_name = str(file_)
		if f_name == '.DS_Store':
			continue
		# print(f_name)#测试用
		# 把当前文件名返加到列表里
		csv_name_list_2.append(f_name)
		# 写入之前的文本中
		f.write(f_name + '\n')
# 看一下列表里的内容，测试用
# print(csv_name_list_2)

# 遍历初始文件夹中每个文件
for csvFilename in csv_name_list_2:
	try:
		# 打开CSV文件
		df = read_csv(read_path_2 + '/' + csvFilename, engine='c', dialect='excel',sep=',',header=None)
		# 读取第二列
		hnu=df[1]
		# print(hnu)#测试用
		# 保存第二列为CSV文件
		hnu.to_csv(save_path_2 + '/' + csvFilename, index=False)
		# 读取刚保存文件，删除第一行索引
		yoink = read_csv(save_path_2 + '/' + csvFilename, engine='c', dialect='excel', skiprows=[0])
		# print(yoink)#测试用
		# 保存修改过的文件
		yoink.to_csv(save_path_2 + '/' + csvFilename, index=False)
	except:
		pass

# 第三次处理
# 待读取批量csv的文件夹
read_path_3 = '文本素材/待合并文件'
# 先创建一个空的文本
f = open("test_name_3.txt", 'w')
# 采用listdir来读取所有文件
files = os.listdir(read_path_3)
# 排序
files.sort()
# 创建一个空列表
csv_name_list_3  = []
# 循环读取每个文件名
for file_ in files:
	# print(read_path_1 +file_)#测试用
	# 判断该文件是否是一个文件夹
	if not os.path.isdir(read_path_3 + file_):
		f_name = str(file_)
		if f_name == '.DS_Store':
			continue
		#print(f_name)#测试用
		# 把当前文件名返加到列表里
		csv_name_list_3.append(f_name)
		# 写入之前的文本中
		f.write(f_name + '\n')
# print(csv_name_list_3)  # 看一下列表里的内容，测试用

# 遍历初始文件夹中每个文件
for csvFilename in csv_name_list_3:
	try:
		# 合并文件并赋给sum
		sum=pd.concat([pd.read_csv(read_path_3+'/'+csvFilename,header=None) for csvFilename in csv_name_list_3],join="inner",axis=1,ignore_index=True)
		# print(sum)#测试用
		# 保存文件为sum.CSV
		sum.to_csv('sum.CSV')
		sum.to_csv('sum_p.CSV',index=False)
		# 打开保存文件sum.CSV，删去索引
		# pd.set_option('display.unicode.east_asian_width',True)
		yoink = read_csv('sum_p.CSV', engine='c', dialect='excel',skiprows=[0])
		# 保存修改好的文件
		yoink.to_csv('sum_p.CSV',index=False)
	except:
		pass

def deawSin():
	c=input(' 是否需要现在绘图（y/n）:')
	if c=='y':
		# 开始绘图
		df=pd.read_csv('sum.CSV')
		x=df.iloc[:,1]
		# print(x)
		length=len(csv_name_list_1)
		# print(length)
		b=input('  是否需要自定义曲线数（y/n）:')
		if b=='y':
			a=eval(input('   输入要画的曲线数量:'))
			y=df.iloc[:,2:a+2].values
			# print(y)
			plt.plot(x,y)
		elif b=='n':
			y = df.iloc[:, 2:].values
			# print(y)
			plt.plot(x, y)
		else:
			print('  输入错误，请检查')
		# 负号不显示
		plt.rcParams['axes.unicode_minus']=False
		plt.xlabel('光波长/nm')
		plt.ylabel('dB')
		# 设置网格线
		plt.grid(color='0.7',linestyle='--',linewidth=1)
		# 设置图例
		csv_name_list_4  = []
		# 循环读取每个文件名
		for i in range(length):
				f_name = str('第{}次'.format(i))
				# print(f_name)
				# 把当前文件名返加到列表里
				csv_name_list_4.append(f_name)
		# 看一下列表里的内容
		# print(csv_name_list_4)
		# 自动调整图例列数
		if len(csv_name_list_4)>41:
			ncoly=2
		else:
			ncoly=1
		# 设置图例及其位置，ncol=2,表示图列分两列
		# 发现一个好玩的，就是不管图例给了多少，他只按照实际曲线数目从前往后取
		plt.legend(csv_name_list_4,bbox_to_anchor=(1.04, 1), loc="upper left",ncol=ncoly)
		# 设置标题
		plt.title('测试光谱')
		plt.show()
	elif c=='n':
		print(' 您已选择不绘图')
	else:
		print(' 输入错误')

# 定义最大值函数,并返回i值
def amax(i,m,df):
	a=max(df[1][i] for i in range(i, m + 1))
	for i in range(i, m + 1):
		if df[1][i]==a:
			break
	return i
# 定义最小值函数,并返回i值
def amin(i,m,df):
	a=min(df[1][i] for i in range(i, m + 1))
	for i in range(i, m + 1):
		if df[1][i]==a:
			break
	return i
# 定义寻峰函数
def xunfeng():
	# 设置数据使用模式
	maxmin=eval(input(" 使用波峰数据(按1)，波谷数据（按2）"))
	if maxmin!=1 and maxmin!=2:
		return(print("  输入错误，请重新输入"))
	# 设置左右起始值
	left = eval(input('  请输入左起波长：'))
	right = eval(input('  请输入右起波长：'))
	# 判断文件是否存在
	if os.path.exists("peak.csv"):
		os.remove("peak.csv")
	
	# 遍历初始文件夹中每个文件
	for csvFilename in csv_name_list_2:
		try:
			# 打开CSV文件
			df = read_csv(read_path_2 + '/' + csvFilename, engine='c', dialect='excel', sep=',', header=None)
			# 读取第一列
			#one = df[0]
			# print(one)#测试用
			# 读取第二列
			#two = df[1]
			# print(two)#测试用
			i = 0
			while df[0][i] <= left:
				i = i + 1
			m = 0
			while df[0][m] <= right:
				m = m + 1
			if maxmin==1:
				scc = amax(i, m, df)
			else:
				scc = amin(i, m, df)
			# print(scc)#测试用
			imax=df[0][scc]
			# print(imax)#测试用
			# 将数据写入文件
			with open("peak.csv", "a", newline="") as cf:
				w = csv.writer(cf)
				w.writerow([imax])
				cf.close()
		except:
			pass
	c = input(' 是否需要现在绘制 波长——时间曲线（y/n）:')
	if c == 'y':
		# 开始绘图
		length = len(csv_name_list_1)
		# print(length)#测试用
		dw = eval(input('  请输入扫描间隔（单位是秒）:'))
		x = [dw * i for i in range(length)]
		# print(x)#测试用
		df = pd.read_csv('peak.csv', dialect='excel', sep=',', header=None)
		y = df.iloc[0:, 0]
		# print(y)#测试用
		plt.plot(x, y)
		# 负号不显示
		plt.rcParams['axes.unicode_minus'] = False
		plt.xlabel('时间/s')
		plt.ylabel('波长/nm')
		# 设置网格线
		plt.grid(color='0.7', linestyle='--', linewidth=1)
		# 设置标题
		plt.title('波长——时间曲线')
		plt.show()
	elif c == 'n':
		print('您已选择不绘图')
		c = input('是否需要输出各波长值（y/n）:')
		if c=='y':
			df = pd.read_csv('peak.csv', dialect='excel', sep=',', header=None)
			y = df.iloc[0:, 0]
			print(y)
		elif c == 'n':
			print('您已选择不输出')
		else:
			print('输入错误')
	else:
		print('输入错误')
xitong=0
while xitong!=1 and xitong != 2:
	print("欢迎使用光谱仪数据处理系统")
	xitong = eval(input("请选择您的系统类型【MacOS（按1），Windows（按2）】："))
	if xitong == 1:
		# 汉字不显示问题（MacOS）
		plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
		print(' 您已选择MacOS系统环境')
	elif xitong == 2:
		# 汉字不显示问题（Windows）
		plt.rcParams['font.sans-serif'] = ['SimHei']
		print(' 您已选择Windows系统环境')
	else:
		print('输入错误，请重新输入')
while xitong!=3 :
	# 设置退出目的，是为了防止按错导致每次程序重新运行带来的时间浪费
	xitong = eval(input('绘制 三角函数图(按1), 绘制 响应/恢复图(按2), 退出(按3):'))
	if xitong==1 :
		deawSin()
	elif xitong==2 :
		xunfeng()
	elif xitong==3:
		print('您已选择退出')
	else:
		print('输入错误，请重新输入')